Longest Increasing Subsequence

Problem page:https://leetcode.com/problems/longest-increasing-subsequence

Solution

class Solution:
    def lengthOfLIS(self, nums: List[int]) -> int:
	# DP solution is easy but slow
        # if not nums:
        #     return 0
        # n = len(nums)
        # dp = [1] * n
        # for i in range(1, n):
        #     for j in range(i):
        #         if nums[i] > nums[j]:
        #             dp[i] = max(dp[i], dp[j] + 1)
        # return max(dp)
        res = []
        def helper(res, n):
            left, right = 0, len(res) - 1
            while left <= right:
                mid = (left + right) // 2
                if res[mid] == n:
                    return mid
                elif res[mid] > n:
                    right = mid - 1
                else:
                    left = mid + 1
            return left
        for n in nums:
            if not res or res[-1] < n:
                res.append(n)
            else:
                index = helper(res,n)
                res[index] = n
        return len(res)

Complexity

  • time: O(n * log n)
  • space: O(n)